package com.spring.lo.ioc;

import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

/**
 * 存储Bean的基本元信息
 * beanName
 * classType（初始化的时候自动识别）
 * scope
 * propertyValues
 * @author zhangbh
 * 2023-05-05 08:42
 **/
@Data
public class BeanDefinition {

    /**
     * 初始化方法
     */
    private String initMethod;
    /**
     * 可选项，如果为空则使用Class#getSimpleName()
     */
    private String beanName;
    /**
     * 作用范围，singleton 单例 prototype 原型
     */
    private String scope;
    /**
     * 全路径类名
     */
    private String className;

    /**
     * 实际类型
     */
    private Class<?> classType;

    /**
     * 属性值
     */
    @Setter(AccessLevel.PRIVATE)
    private List<PropertyValue> propertyValues = new ArrayList<>();


    /**
     * 单例模式
     */
    private static final String SCOPE_SINGLETON = "singleton";
    /**
     * 原型模式
     */
    private static final String SCOPE_PROTOTYPE = "prototype";


    public BeanDefinition(String beanName, String className) {
        this.beanName = beanName;
        this.className = className;
        this.classType = resolveClassType(className);
    }

    /**
     * 获取到实际类型
     * @param className 全路径名称
     * @return class
     */
    private Class<?> resolveClassType(String className) {
        try {
            return Class.forName(className);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 增加属性
     * @param value 属性值
     * @return 当前元信息
     */
    public BeanDefinition addPropertyValue(PropertyValue value) {
        propertyValues.add(value);
        return this;
    }

    /**
     * 是否是单例模式
     */
    public boolean isSingleton() {
        return SCOPE_SINGLETON.equals(scope);
    }

    /**
     * 是否是原型模式
     */
    public boolean isPrototype() {
        return SCOPE_PROTOTYPE.equals(scope);
    }
}
